/**
 * 匿名函数的传参
 * @param {} val 
 */
function makeFn (val){
  console.log(`val:${val}`)
  console.log(arguments)
  return (...args)=>{
    console.log(`args:${args}`)
  }
}
const fn = makeFn
fn(4)(6)

/**
 * 扩充知识点arguments
 * 函数内部可用的 arguments 对象来访问函数的实参
 * 1.箭头函数没有自己的this，arguments，super或new.target。
 * 2.它的this、arguments都是在定义函数时绑定外层的this和arguments，而不是在执行过程中绑定的，所以不会因为调用者不同而发生变化
 * 3.箭头函数若想得到自身的入参列表arguments，必须使用剩余参数表示法。
 * 4.箭头函数表达式更适用于那些本来需要匿名函数的地方，并且它不能用作构造函数
 *  @param {} fn 
 */
function once1 (fn){
  let done = false
  return function (){
    if(!done){
      done = true
      console.log(arguments)
      return fn.apply(this,arguments)
    }
  }
}
const once2 = (fn)=>{
  let done = false
  return (...args)=>{
    if(!done){
      done = true
      console.log(args)
      return fn.apply(this,args)
    }
  }
}
let pay = once1((money)=>{console.log(money)})
pay(5)